package com.pe.pgn.clubpgn.dao.impl;

import java.util.Calendar;
import java.util.List;

import javax.sql.DataSource;

import org.apache.commons.lang.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.stereotype.Repository;

import com.pe.pgn.clubpgn.common.CLPConstantes;
import com.pe.pgn.clubpgn.dao.PromocionConsumoDao;
import com.pe.pgn.clubpgn.dao.hibernate.GenericDaoHibernate;
import com.pe.pgn.clubpgn.domain.ClpmPromocionConsumo;

@Repository("promocionConsumoDao")
public class PromocionConsumoDaoImpl extends GenericDaoHibernate<ClpmPromocionConsumo, Long>
		implements PromocionConsumoDao {

	private JdbcTemplate jdbcTemplate;
	
	public PromocionConsumoDaoImpl(){
		super(ClpmPromocionConsumo.class);
	}
	
	@Autowired
	public void setDataSource(DataSource dataSource) {
		this.jdbcTemplate = new JdbcTemplate(dataSource);
	}
	
	@SuppressWarnings("unchecked")
	public List<ClpmPromocionConsumo> buscarPromocionesConsumo(String dePromocionConsumo, 
			 String stPromocionConsumo, boolean esInicial){
		
		StringBuffer query = new StringBuffer();
		query.append("select id as id, ");
		query.append("		co_numero_vale_inicial as coNumeroValeInicial, ");
		query.append("		co_numero_vale_final as coNumeroValeFinal, ");
		query.append("		de_promocion_consumo as dePromocionConsumo, ");
		query.append("		st_promocion as stEstadoPromocionConsumo ");
		query.append("	from clpm_promocion_consumo ");
		
		if(esInicial){
			
			StringBuffer queryInicial = new StringBuffer();
			queryInicial.append("select * from (").append(query.toString());
			queryInicial.append("	where st_promocion = '").append(CLPConstantes.ST_VERDADERO).append("' ");
			queryInicial.append(" order by id desc ");
			queryInicial.append(") where rownum <=").append(CLPConstantes.MAXIMO_RESULTADO_INICIAL);
			
			query = new StringBuffer(queryInicial.toString());
		}
		else{
			
			query.append("	where 1 = 1 ");
			if(StringUtils.isNotBlank(dePromocionConsumo)){	
				query.append("	 	and upper(trim(de_promocion_consumo)) like '%").append(dePromocionConsumo).append("%'");
			}
			
			if(StringUtils.isNotBlank(stPromocionConsumo)
					&& !stPromocionConsumo.equalsIgnoreCase(CLPConstantes.CARACTER_GUION_NO_ESPACIOS)){
				
				query.append("		and st_promocion = '").append(stPromocionConsumo).append("' ");
			}
			

			query.append(" order by id desc ");
		}
		
		List<ClpmPromocionConsumo> promociones = findListOfBeans(query.toString(), null, ClpmPromocionConsumo.class);
		return promociones;		
	}
	
	public void guardarPromocionConsumo(ClpmPromocionConsumo promocionConsumo){
		
		if(promocionConsumo.getId() != null){
			
			promocionConsumo.setCoUsuarioModificador(getUsuarioLogueado().getUsername());
			promocionConsumo.setDaFechaModificacion(Calendar.getInstance());
		}
		else{
			promocionConsumo.setCoUsuarioCreador(getUsuarioLogueado().getUsername());
			promocionConsumo.setDaFechaCreacion(Calendar.getInstance());
		}
		
		getHibernateTemplate().saveOrUpdate(promocionConsumo);
		getHibernateTemplate().flush();
	}
	
	public ClpmPromocionConsumo obtenerPromocionConsumo(Long id){
		
		ClpmPromocionConsumo promocionConsumo = get(id);
		return promocionConsumo;
	}
	
	public void eliminarPromocionConsumo(Long id){
		
		remove(id);
		getHibernateTemplate().flush();		
	}
	
	public boolean esDescripcionRepetida(ClpmPromocionConsumo promocionConsumo){

		StringBuffer query = new  StringBuffer();
		query.append("select count(*) ");
		query.append("	from clpm_promocion_consumo ");
		query.append("	where upper(trim(de_promocion_consumo)) = '").append(promocionConsumo.getDePromocionConsumo().trim().toUpperCase()).append("' ");
		query.append("		and st_promocion = '").append(CLPConstantes.ST_VERDADERO).append("' ");
		
		if(promocionConsumo.getId() != null){
			
			query.append("	and id != ").append(promocionConsumo.getId());
		}
		
		int count = jdbcTemplate.queryForInt(query.toString());
		if(count > 0){
			
			return Boolean.TRUE;
		}
		return Boolean.FALSE;
	}
	
}
